home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Mark Pilgrim / Kant Generator Pro 1.0.1 / source / kode new / kant build files.c next >
Encoding:
C/C++ Source or Header  |  1994-10-30  |  10.5 KB  |  464 lines  |  [TEXT/MMCC]

  1. #include "kant build files.h"
  2. #include "kant build meat.h"
  3. #include "text twiddling.h"
  4. #include "window layer.h"
  5. #include "resource utilities.h"
  6. #include "file interface.h"
  7. #include "file utilities.h"
  8. #include "menus.h"
  9. #include "graphics.h"
  10. #include "window layer.h"
  11. #include "program globals.h"
  12. #include "util.h"
  13. #include <Script.h>
  14.  
  15. #define MODULE_FOLDER_NAME    "\pModules ƒ"
  16.  
  17. static    OSErr CreateNewModuleFile(FSSpec *theFS, Boolean deleteTheThing);
  18.  
  19. void UseTheModule(FSSpec *theFS, Boolean useDefault)
  20. {
  21.     gModuleFS=*theFS;
  22.     gUseDefault=useDefault;
  23.     RebuildReferencesList();
  24. }
  25.  
  26. OSErr GetNamedModuleFS(FSSpec *theFS, Str255 theName)
  27. {
  28.     FSSpec            appFS;
  29.     OSErr            oe;
  30.     CInfoPBRec        pb_dir;
  31.     
  32.     if ((oe=GetApplicationFSSpec(&appFS))!=noErr)
  33.         return oe;
  34.     
  35.     pb_dir.dirInfo.ioCompletion=0L;
  36.     pb_dir.dirInfo.ioNamePtr=MODULE_FOLDER_NAME;
  37.     pb_dir.dirInfo.ioVRefNum=appFS.vRefNum;
  38.     pb_dir.dirInfo.ioFDirIndex=0; /* very important */
  39.     pb_dir.dirInfo.ioDrDirID=appFS.parID;
  40.     if ((oe=PBGetCatInfo(&pb_dir, FALSE))!=noErr)
  41.         return oe;
  42.     
  43.     Mymemcpy((Ptr)theFS->name, (Ptr)theName, theName[0]+1);
  44.     theFS->vRefNum=appFS.vRefNum;
  45.     theFS->parID=pb_dir.dirInfo.ioDrDirID;
  46.     
  47.     return FileExists(theFS);
  48. }
  49.  
  50. OSErr BuildReferencesList(MenuHandle theMenu, FSSpec theFS)
  51. {
  52.     OSErr            oe;
  53.     short            oldRefNum, refNum, numStringResources, resID, i;
  54.     Boolean            alreadyOpen, full;
  55.     Str255            resName;
  56.     ResType            resType;
  57.     Handle            resHandle;
  58.     
  59.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, TRUE))!=noErr)
  60.         return oe;
  61.     
  62.     numStringResources=Count1Resources('STR#');
  63.     full=FALSE;
  64.     for (i=1; i<=numStringResources; i++)
  65.     {
  66.         resHandle=Get1IndResource('STR#', i);
  67.         if (resHandle==0L)
  68.             return ResError();
  69.         
  70.         GetResInfo(resHandle, &resID, &resType, resName);
  71.         oe=ResError();
  72.         ReleaseResource(resHandle);
  73.         if (oe!=noErr)
  74.         {
  75.             CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  76.             return oe;
  77.         }
  78.         
  79.         AppendMenu(theMenu, "\p ");
  80.         SetItem(theMenu, CountMItems(theMenu), resName);
  81.     }
  82.     
  83.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  84.     
  85.     return noErr;
  86. }
  87.  
  88. OSErr BuildModulesList(MenuHandle theMenu)
  89. {
  90.     FSSpec            appFS;
  91.     OSErr            oe;
  92.     CInfoPBRec        pb_dir;
  93.     HParamBlockRec    pb_file;
  94.     Str255            theName;
  95.     short            i;
  96.     
  97.     if ((oe=GetApplicationFSSpec(&appFS))!=noErr)
  98.         return oe;
  99.     
  100.     pb_dir.dirInfo.ioCompletion=0L;
  101.     pb_dir.dirInfo.ioNamePtr=MODULE_FOLDER_NAME;
  102.     pb_dir.dirInfo.ioVRefNum=appFS.vRefNum;
  103.     pb_dir.dirInfo.ioFDirIndex=0; /* very important */
  104.     pb_dir.dirInfo.ioDrDirID=appFS.parID;
  105.     if ((oe=PBGetCatInfo(&pb_dir, FALSE))!=noErr)
  106.         return oe;
  107.     
  108.     if (pb_dir.dirInfo.ioDrNmFls==0)
  109.         return noErr;
  110.     
  111.     for (i=1; (i<=pb_dir.dirInfo.ioDrNmFls); i++)
  112.     {
  113.         pb_file.fileParam.ioCompletion=0L;
  114.         pb_file.fileParam.ioNamePtr=theName;
  115.         pb_file.fileParam.ioVRefNum=appFS.vRefNum;
  116.         pb_file.fileParam.ioFDirIndex=i;
  117.         pb_file.fileParam.ioDirID=pb_dir.dirInfo.ioDrDirID;
  118.         if ((oe=PBGetCatInfo((CInfoPBPtr)&pb_file, FALSE))==noErr)
  119.         {
  120.             if ((pb_file.fileParam.ioFlFndrInfo.fdType==BUILD_TYPE) &&
  121.                 (pb_file.fileParam.ioFlFndrInfo.fdCreator==CREATOR))
  122.             {
  123.                 /* if theName contains a / character, it will be interpreted as a */
  124.                 /* meta-character by AppendMenu but not by SetItem */
  125.                 AppendMenu(theMenu, "\p ");
  126.                 SetItem(theMenu, CountMItems(theMenu), theName);
  127.             }
  128.         }
  129.     }
  130.     
  131.     return noErr;
  132. }
  133.  
  134. OSErr DoNewModule(void)
  135. {
  136.     FSSpec            theFS;
  137.     Boolean            deleteTheThing;
  138.     OSErr            oe;
  139.     
  140.     theFS.name[0]=0x00;
  141.     if (!GetDestFile(&theFS, &deleteTheThing, "\pSave new module as..."))
  142.         return -1;
  143.     
  144.     if ((oe=CreateNewModuleFile(&theFS, deleteTheThing))!=noErr)
  145.         return oe;
  146.     
  147.     RebuildModulesList();
  148.     
  149.     return OpenTheModule(&theFS, TRUE, FALSE);
  150. }
  151.  
  152. OSErr OpenTheModule(FSSpec *theFS, Boolean newModule, Boolean useOldFile)
  153. {
  154.     WindowPtr        buildWindow;
  155.     
  156.     if ((!newModule) && (!useOldFile))
  157.     {
  158.         if (!GetSourceFile(theFS, BUILD_TYPE))
  159.             return -1;
  160.     }
  161.     
  162.     OpenTheIndWindow(kBuildWindow);
  163.     buildWindow=GetIndWindowPtr(kBuildWindow);
  164.     SetWTitle(buildWindow, theFS->name);
  165.     SetWindowTitle(buildWindow, theFS->name);
  166.     SetWindowFS(buildWindow, *theFS);
  167.     UseTheModule(theFS, FALSE);
  168.     
  169.     return newModule ? noErr : BuildTEFromResourceFile(*theFS, buildWindow);
  170. }
  171.  
  172. Boolean ReferenceNameExistsQQ(FSSpec theFS, Str255 refName)
  173. {
  174.     OSErr            oe;
  175.     short            oldRefNum, refNum;
  176.     Boolean            alreadyOpen;
  177.     Handle            resHandle;
  178.     Boolean            exists;
  179.     
  180.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, TRUE))!=noErr)
  181.         return FALSE;
  182.     
  183.     resHandle=Get1NamedResource('STR#', refName);
  184.     exists=(resHandle!=0L);
  185.     if (exists)
  186.         ReleaseResource(resHandle);
  187.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  188.     
  189.     return exists;
  190. }
  191.  
  192. OSErr DeleteOneReference(FSSpec theFS, Str255 refName)
  193. {
  194.     OSErr            oe;
  195.     short            oldRefNum, refNum;
  196.     Boolean            alreadyOpen;
  197.     Handle            resHandle;
  198.     
  199.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  200.         return oe;
  201.     
  202.     resHandle=Get1NamedResource('STR#', refName);
  203.     if (resHandle==0L)
  204.         return ResError();
  205.     
  206.     RmveResource(resHandle);
  207.     oe=ResError();
  208.     if (oe==noErr)
  209.     {
  210.         UpdateResFile(refNum);
  211.         DisposeHandle(resHandle);    /* correct, this handle is no longer a resource */
  212.     }
  213.     else ReleaseResource(resHandle);
  214.     
  215.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  216.     
  217.     return oe;
  218. }
  219.  
  220. OSErr DeleteOneInstantiation(FSSpec theFS, Str255 refName, short stringIndex)
  221. {
  222.     OSErr            oe;
  223.     short            oldRefNum, refNum, resID;
  224.     Boolean            alreadyOpen;
  225.     ResType            resType;
  226.     Handle            resHandle;
  227.     Str255            dummy;
  228.     
  229.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  230.         return oe;
  231.     
  232.     resHandle=Get1NamedResource('STR#', refName);
  233.     if (resHandle!=0L)
  234.     {
  235.         GetResInfo(resHandle, &resID, &resType, dummy);
  236.         ReleaseResource(resHandle);        /* just needed resID */
  237.         
  238.         oe=DeleteIndString(resID, stringIndex);
  239.     }
  240.     else oe=ResError();
  241.     
  242.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  243.     
  244.     return oe;
  245. }
  246.  
  247. OSErr AddOneReference(FSSpec theFS, Str255 refName)
  248. {
  249.     OSErr            oe;
  250.     short            oldRefNum, refNum;
  251.     Boolean            alreadyOpen;
  252.     Handle            resHandle;
  253.     
  254.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  255.         return oe;
  256.     
  257.     resHandle=NewHandle(2L);
  258.     **((short**)resHandle)=0;
  259.     AddResource(resHandle, 'STR#', Unique1ID('STR#'), refName);
  260.     oe=ResError();
  261.     
  262.     if (oe==noErr)
  263.     {
  264.         WriteResource(resHandle);
  265.         oe=ResError();
  266.     }
  267.     
  268.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  269.     ReleaseResource(resHandle);
  270.     
  271.     return oe;
  272. }
  273.  
  274. OSErr AddOneInstantiation(FSSpec theFS, Str255 refName, Str255 instantName)
  275. {
  276.     OSErr            oe;
  277.     short            oldRefNum, refNum, resID;
  278.     Boolean            alreadyOpen;
  279.     Str255            dummy;
  280.     ResType            resType;
  281.     Handle            resHandle;
  282.     
  283.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  284.         return oe;
  285.     
  286.     resHandle=Get1NamedResource('STR#', refName);
  287.     if (resHandle!=0L)
  288.     {
  289.         GetResInfo(resHandle, &resID, &resType, dummy);
  290.         ReleaseResource(resHandle);        /* just needed resID */
  291.         
  292.         oe=AddIndString(instantName, resID);
  293.     }
  294.     else oe=ResError();
  295.     
  296.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  297.     
  298.     return oe;
  299. }
  300.  
  301. OSErr ReplaceOneReference(FSSpec theFS, Str255 oldRef, Str255 newRef)
  302. {
  303.     OSErr            oe;
  304.     short            oldRefNum, refNum, resID;
  305.     Boolean            alreadyOpen;
  306.     Str255            resName;
  307.     ResType            resType;
  308.     Handle            resHandle;
  309.     
  310.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  311.         return oe;
  312.     
  313.     resHandle=Get1NamedResource('STR#', oldRef);
  314.     if (resHandle==0L)
  315.         return ResError();
  316.     
  317.     GetResInfo(resHandle, &resID, &resType, resName);
  318.     SetResInfo(resHandle, resID, newRef);
  319.     oe=ResError();
  320.     if (oe==noErr)
  321.     {
  322.         ChangedResource(resHandle);
  323.         WriteResource(resHandle);
  324.         UpdateResFile(refNum);
  325.         oe=ResError();
  326.     }
  327.     
  328.     ReleaseResource(resHandle);
  329.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  330.     
  331.     return oe;
  332. }
  333.  
  334. OSErr ReplaceOneInstantiation(FSSpec theFS, Str255 oldRef, short stringIndex, Str255 newStr)
  335. {
  336.     OSErr            oe;
  337.     short            oldRefNum, refNum, resID;
  338.     Boolean            alreadyOpen;
  339.     Str255            resName;
  340.     ResType            resType;
  341.     Handle            resHandle;
  342.     
  343.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, FALSE))!=noErr)
  344.         return oe;
  345.     
  346.     resHandle=Get1NamedResource('STR#', oldRef);
  347.     if (resHandle!=0L)
  348.     {
  349.         GetResInfo(resHandle, &resID, &resType, resName);
  350.         ReleaseResource(resHandle);        /* just needed resID */
  351.         oe=SetIndString(newStr, resID, stringIndex);
  352.     }
  353.     else oe=ResError();
  354.     
  355.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  356.     
  357.     return oe;
  358. }
  359.  
  360. OSErr BuildTEFromResourceFile(FSSpec theFS, WindowPtr theWindow)
  361. {
  362.     OSErr            oe;
  363.     short            oldRefNum, refNum, numStringResources, numStringsInResource, resID, i, j;
  364.     Boolean            alreadyOpen, full;
  365.     TEHandle        hTE;
  366.     Str255            resName, theName;
  367.     ResType            resType;
  368.     Handle            resHandle;
  369.     CursHandle        theCursor;
  370.     
  371.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, TRUE))!=noErr)
  372.         return oe;
  373.     
  374.     hTE=GetWindowTE(theWindow);
  375.     if (hTE==0L)
  376.         return -1;
  377.     ZapDrawHook(hTE);
  378.     
  379.     theCursor=GetCursor(watchCursor);
  380.     SetCursor(*theCursor);
  381.     numStringResources=Count1Resources('STR#');
  382.     full=FALSE;
  383.     for (i=1; ((i<=numStringResources) && (!full)); i++)
  384.     {
  385.         resHandle=Get1IndResource('STR#', i);
  386.         GetResInfo(resHandle, &resID, &resType, resName);
  387.         if (!AddNameToTE(hTE, resName, TRUE))
  388.         {
  389.             full=TRUE;
  390.             break;
  391.         }
  392.         
  393.         numStringsInResource=**((short**)resHandle);
  394.         for (j=1; ((j<=numStringsInResource) && (!full)); j++)
  395.         {
  396.             GetIndString(theName, resID, j);
  397.             if (!AddNameToTE(hTE, theName, FALSE))
  398.             {
  399.                 full=TRUE;
  400.                 break;
  401.             }
  402.         }
  403.         ReleaseResource(resHandle);
  404.     }
  405.     
  406.     SetCursor(&qd.arrow);
  407.     ReleaseResource((Handle)theCursor);
  408.     
  409.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  410.     RestoreDrawHook(hTE);
  411.     AdjustVScrollBar(GetWindowVScrollBar(theWindow), hTE);
  412.     
  413.     return full ? -2 : noErr;
  414. }
  415.  
  416. OSErr AddInstantiationsFromFile(FSSpec theFS, WindowPtr theWindow, Str255 refName)
  417. {
  418.     OSErr            oe;
  419.     short            oldRefNum, refNum, numStringsInResource, resID, j;
  420.     Boolean            alreadyOpen, full;
  421.     TEHandle        hTE;
  422.     Str255            resName, theName;
  423.     ResType            resType;
  424.     Handle            resHandle;
  425.     
  426.     if ((oe=OpenTheResFile(&theFS, &oldRefNum, &refNum, &alreadyOpen, TRUE))!=noErr)
  427.         return oe;
  428.     
  429.     hTE=GetWindowTE(theWindow);
  430.     if (hTE==0L)
  431.         return -1;
  432.     
  433.     resHandle=Get1NamedResource('STR#', refName);
  434.     GetResInfo(resHandle, &resID, &resType, resName);
  435.     
  436.     numStringsInResource=**((short**)resHandle);
  437.     full=FALSE;
  438.     for (j=1; ((j<=numStringsInResource) && (!full)); j++)
  439.     {
  440.         GetIndString(theName, resID, j);
  441.         if (!AddNameToTE(hTE, theName, FALSE))
  442.             full=TRUE;
  443.     }
  444.     
  445.     ReleaseResource(resHandle);
  446.     CloseTheResFile(oldRefNum, refNum, alreadyOpen);
  447.     return full ? -2 : noErr;
  448. }
  449.  
  450. /* the rest of these are internal to kant build files.c */
  451.  
  452. static    OSErr CreateNewModuleFile(FSSpec *theFS, Boolean deleteTheThing)
  453. {
  454.     OSErr            oe;
  455.     
  456.     if (deleteTheThing)
  457.         if ((oe=FSpDelete(theFS))!=noErr)
  458.             return oe;
  459.     
  460.     FSpCreateResFile(theFS, CREATOR, BUILD_TYPE, smSystemScript);
  461.     
  462.     return ResError();
  463. }
  464.